package com.ruoyi.business.service;

import org.activiti.engine.history.HistoricActivityInstance;
import org.activiti.engine.history.HistoricProcessInstance;
import org.activiti.engine.history.HistoricTaskInstance;
import org.activiti.engine.repository.Deployment;
import org.activiti.engine.repository.ProcessDefinition;
import org.activiti.engine.runtime.ProcessInstance;
import org.activiti.engine.task.Task;

import java.io.FileNotFoundException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public interface IProcessService {
    Deployment deploy(String filePath) throws FileNotFoundException;

    /**
     * 根据部署Id获取流程实例对象
     * @param deploymentId
     * @return 流程定义对象
     */
    ProcessDefinition getProcessDefinitionByDeploymentId(String deploymentId);

    /**
     * 根据部署Id获取xml文件输入流
     * @param deploymentId
     * @return 文件输入流
     */
    InputStream getFileAsXMLAsStreamByDeploymentId(Long deploymentId);

    /**
     * 根据部署Id获取Img输入流
     * @param deploymentId
     * @return 图片输出流
     */
    InputStream GenerateImgAsStreamByDeploymentId(Long deploymentId);

    /**
     * 开启审核流程
     *
     * @param definitionKey 流程定义 id
     * @param businessKey   业务标识
     * @param map           流程变量
     * @return              流程定义对象
     */
    ProcessInstance startProcessDefinition(String definitionKey, String businessKey, HashMap<String, Object> map);

    /**
     * 根据流程实例id 获取当前正在进行中的任务
     * @param id 进行中的任务id
     * @return 进行中的任务对象
     */
    List<Task> getTaskByInstanceId(String id);

    /**
     * 设置任务候选人
     * @param taskId 任务Id
     * @param userId 任务候选人Id
     */
    void setTaskCandidateUser(String taskId, String userId);

    /**
     * 根据流程实例Id获取流程图片
     * @param instanceId 流程实例Id
     * @return 图片输入流
     */
    InputStream GenerateImgAsStreamByInstanceId(Long instanceId);

    /**
     * 根据流程实例Id删除流程实例,并且批注理由
     * @param instanceId 流程实例Id
     * @param reason 理由
     */
    void deleteProcessInstance(String instanceId, String reason);

    /**
     * 根据当前用户获取指定流程定义下的待办任务
     * @param definitionKey 流程定义
     * @param userId 用户Id
     * @param startIndex 分页开始
     * @param pageSize 每页条数
     * @return 任务列表
     */
    List<Task> getTaskListByDefinitionKeyAndUserId(String definitionKey, String userId, int startIndex, Integer pageSize);

    /**
     * 获取待办任务总数
     * @param definitionKey
     * @param toString
     * @return
     */
    long getTaskCountByDefinitionKeyAndUserId(String definitionKey, String toString);

    /**
     * 根据实例Id拿到实例对象
     * @param processInstanceId 实例Id
     * @return 实例对象
     */
    ProcessInstance getProcessInstanceById(String processInstanceId);

    /**
     * 根据任务Id获取任务对象
     * @param taskId 任务Id
     * @return 任务对象
     */
    Task getTaskById(String taskId);

    /**
     * 领取并完成任务
     * @param task 任务对象
     * @param auditStatus 同意,拒绝
     * @param comment 批注
     */
    void claimAndCompleteTask(Task task, boolean auditStatus, String comment);

    /**
     * 领取并完成任务-重新申请
     * @param taskId 任务id
     * @param variables 金额
     * @param comment 批注
     */
    void claimAndCompleteTask(String taskId, Map<String, Object> variables, String comment);

    /**
     * 添加批注
     * @param instanceId 实例Id
     * @param taskId 任务Id
     * @param comment 批注
     */
    void addTaskComment(String taskId, String instanceId, String comment);

    /**
     * 覆盖指定流程实例下的流程变量
     * @param taskId 任务Id
     * @param variables 金额(流程变量)
     */
    void setVariables(String taskId, Map<String, Object> variables);

    /**
     * 查询已完成业务总数
     * @param definitionKey 流程定义key
     * @param userId 当前用户Id
     * @return 总数
     */
    long selectDoneTaskCount(String definitionKey, String userId);

    /**
     * 查询已完成任务列表
     * @param definitionKey 流程定义Key
     * @param userId
     * @param startPage
     * @param pageSize
     * @return
     */
    List<HistoricTaskInstance> selectDoneTaskList(String definitionKey, String userId, Integer startPage, Integer pageSize);

    /**
     * 根据流程实例Id查询历史记录
     * @param processInstanceId
     * @return
     */
    HistoricProcessInstance getHistoricProcessInstanceById(String processInstanceId);

    /**
     * 根据实例Id查询历史活动对象
     * @param instanceId
     * @return
     */
    List<HistoricActivityInstance> selectHistoryList(String instanceId);

    /**
     * 根据任务Id获取任务批注
     * @param taskId
     * @return
     */
    String selectHistoryTaskCommentByTaskId(String taskId);
}
